﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using OfficeOpenXml;
using GestionePolveriImporter.Configuration;
using FrameworkLib.Configuration;
using GestionePolveriLib.BL;
using GestionePolveriLib.Facades;
using System.Transactions;

namespace GestionePolveriImporter
{
    public partial class Form1 : Form
    {
        const string FILEPATH = @"C:\Users\melnac\Desktop\Fimet\DB_MAGAZZINO_POLVERI_.xlsx";

        FileInfo existingFile = null;
        ExcelPackage xlPackage = null;
        string m_worksheetName = string.Empty;

        public Form1()
        {
            InitializeComponent();
        }

        void btnChoose_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog ofdlg = new OpenFileDialog();
                ofdlg.FileName = FILEPATH;
                if (ofdlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    this.txtDataSourcePath.Text = ofdlg.FileName;

                    existingFile = new FileInfo(this.txtDataSourcePath.Text);

                    xlPackage = new ExcelPackage(existingFile);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);

                xlPackage.Dispose();
            }
        }

        private void OnlyNumberKeyPress(object sender, KeyPressEventArgs e)
        {
            if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), "\\d+"))
                e.Handled = true;
        }

        private void btnImport_Click(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource = null;

            try
            {
                ImportPolveri();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource = null;

            try
            {
                ImportColori();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource = null;

            try
            {
                ImportComposizioneColori();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource = null;

            try
            {
                ImportPolveriParticolariVenatura();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource = null;

            try
            {
                ImportMovimenti();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            this.dataGridView1.DataSource = null;

            try
            {
                ImportLotti();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void ImportComposizioneColori()
        {
            Importer imp = new Importer();

            ImportHelper.ExcelPackage = xlPackage;

            // importazione colori...
            List<ComposizioneColoreExt> data = (List<ComposizioneColoreExt>)imp.Import<ComposizioneColoreExt>(2, ImportHelper.ImportComposizioneColori);

            if (!this.chkPreviewData.Checked)
            {
                ComposizioneColoreFacadeExt cf = new ComposizioneColoreFacadeExt();
                cf.Transact(() =>
                {
                    foreach (ComposizioneColoreExt c in data)
                    {
                        cf.Add(c);
                    }
                });
            }
            else
            {
                this.dataGridView1.DataSource = data;
            }
        }

        private void ImportColori()
        {
            Importer imp = new Importer();

            ImportHelper.ExcelPackage = xlPackage;

            // importazione colori...
            List<Colore> data = (List<Colore>)imp.Import<GestionePolveriLib.BL.Colore>(0, ImportHelper.ImportColori);

            if (!this.chkPreviewData.Checked)
            {
                ColoriFacade cf = new ColoriFacade();
                cf.Transact(() =>
                {
                    foreach (Colore c in data)
                    {
                        cf.Add(c);
                    }
                });
            }
            else
            {
                this.dataGridView1.DataSource = data;
            }
        }

        private void ImportPolveri()
        {
            Importer imp = new Importer();

            ImportHelper.ExcelPackage = xlPackage;

            // importazione polveri...
            List<Polvere> data = (List<Polvere>)imp.Import<GestionePolveriLib.BL.Polvere>(1, ImportHelper.ImportPolveri);

            if (!this.chkPreviewData.Checked)
            {
                PolvereFacade pf = new PolvereFacade();
                pf.Transact(() =>
                {
                    foreach (Polvere p in data)
                    {
                        pf.Add(p);
                    }
                });
            }
            else
            {
                this.dataGridView1.DataSource = data;
            }
        }

        private void ImportPolveriParticolariVenatura()
        {
            Importer imp = new Importer();

            ImportHelper.ExcelPackage = xlPackage;

            // importazione polveri...
            List<Polvere> data = (List<Polvere>)imp.Import<GestionePolveriLib.BL.Polvere>(3, ImportHelper.ImportPolveriParticolariVenatura);

            if (!this.chkPreviewData.Checked)
            {
                PolvereFacade pf = new PolvereFacade();
                pf.Transact(() =>
                {
                    foreach (Polvere p in data)
                    {
                        pf.Add(p);
                    }
                });
            }
            else
            {
                this.dataGridView1.DataSource = data;
            }
        }

        private void ImportLotti()
        {
            Importer imp = new Importer();

            ImportHelper.ExcelPackage = xlPackage;

            // importazione polveri...
            List<Lotto> data = (List<Lotto>)imp.Import<Lotto>(4, ImportHelper.ImportLotti);

            if (!this.chkPreviewData.Checked)
            {
                LottoFacade lf = new LottoFacade();
                lf.Transact(() =>
                {
                    foreach (Lotto obj in data)
                    {
                        lf.AddLotto(obj);
                    }
                });
            }
            else
            {
                this.dataGridView1.DataSource = data;
            }
        }

        private void ImportMovimenti()
        {
            Importer imp = new Importer();

            ImportHelper.ExcelPackage = xlPackage;

                // importazione colori...
                List<MovimentoLottoBag> data = (List<MovimentoLottoBag>)imp.Import<MovimentoLottoBag>(4, ImportHelper.ImportMovimenti);

                List<Lotto> m_lotti = new List<Lotto>();

                //if (!this.chkPreviewData.Checked)
                //{
                try
                {
                    foreach (MovimentoLottoBag mlb in data)
                    {
                        if (mlb.Movimento.IDCausale == 2) // carico
                        {
                            this.AddCarico(mlb.Lotto, mlb.Movimento);
                        }
                        else
                        {
                            if (mlb.Movimento.IDCausale == 3) // scarico
                            {
                                this.AddScarico(mlb.Lotto, mlb.Movimento);
                            }
                        }
                    }

                    MessageBox.Show("Finito !!");
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                //}
                //else
                //{
                //    this.dataGridView1.DataSource = m_lotti;
                //}

        }

        public bool AddCarico(Lotto lotto, Movimento movimento)
        {
            bool retValue = false;


            using (TransactionScope transaction = new TransactionScope())
            {
                // inserisco prima il record relativo al lotto
                Lotto lot = new Lotto();
                lot.CodLotto = lotto.CodLotto;
                lot.NumDdt = lotto.NumDdt;
                lot.DataDdt = lotto.DataDdt;
                lot.DataScadenzaLotto = lotto.DataScadenzaLotto;
                lot.Giacenza = movimento.Quantita;
                lot.GiacenzaIniziale = movimento.Quantita;
                lot.PrezzoUnitario = 0;
                lot.IDPolvere = lotto.IDPolvere;

                LottoFacade impl = new LottoFacade();
                long idl = impl.AddLotto(lot);

                // inserisco il record relativo al movimento
                Movimento imp = new Movimento();
                imp.IDCausale = movimento.IDCausale;
                imp.DataMovimento = movimento.DataMovimento;

                imp.IDPolvere = movimento.IDPolvere;
                imp.IDFormato = movimento.IDFormato;
                imp.NumScatole = movimento.NumScatole;
                imp.Quantita = movimento.Quantita;
                //imp.Giacenza = movimento.Quantita;
                //imp.Valore = 0;

                imp.Note = movimento.Note;
                //imp.Operatore = this.Principal.Operatore.ID;
                imp.IDLotto = idl;

                MovimentiFacade impf = new MovimentiFacade();
                impf.AddMovimento(imp);

                // gestione dello stato di movimentazione del lotto...
                impl.UpdateStatoMovimentazione(idl, false);

                transaction.Complete();

                //MessageBox.Show("Inserimento Effettuato con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                retValue = true;
            }

            //
            return retValue;
        }

        public bool AddScarico(Lotto lotto, Movimento movimento)
        {
            bool retValue = false;

            using (System.Transactions.TransactionScope transaction = new System.Transactions.TransactionScope())
            {
                // inserisco il record relativo al movimento di scarico
                Movimento imp = new Movimento();
                imp.GiacenzaInsufficienteFlag = false;
                imp.SottoScortaFlag = false;

                imp.IDCausale = movimento.IDCausale;
                imp.DataMovimento = movimento.DataMovimento;

                imp.IDPolvere = movimento.IDPolvere;
                imp.IDFormato = movimento.IDFormato;
                imp.NumScatole = movimento.NumScatole;

                //
                LottoFacade lf = new LottoFacade();
                Lotto m_lotto = lf.GetLottoPiuVecchio(lotto.CodLotto, movimento.Quantita); // .GetLotto(lotto.CodLotto);
                if (m_lotto == null)
                {
                    Lotto lot = new Lotto();
                    lot.CodLotto = lotto.CodLotto;
                    lot.NumDdt = lotto.NumDdt;
                    lot.DataDdt = lotto.DataDdt;
                    lot.DataScadenzaLotto = lotto.DataScadenzaLotto;
                    lot.Giacenza = movimento.Quantita;
                    lot.PrezzoUnitario = 0;
                    lot.IDPolvere = lotto.IDPolvere;

                    long idl = lf.AddLotto(lot);
                    m_lotto = lf.GetLotto(idl);
                }

                //Lotto lot = new Lotto();
                //lot.CodLotto = lotto.CodLotto;
                //lot.NumDdt = lotto.NumDdt;
                //lot.DataDdt = lotto.DataDdt;
                //lot.DataScadenzaLotto = lotto.DataScadenzaLotto;
                //lot.Giacenza = movimento.Quantita;
                //lot.PrezzoUnitario = 0;
                //lot.IDPolvere = lotto.IDPolvere;

                //long idl = lf.AddLotto(lot);
                //Lotto m_lotto = lf.GetLotto(idl);

                imp.IDLotto = m_lotto.IDLotto;

                imp.Quantita = movimento.Quantita;
                //imp.Giacenza = m_lotto.Giacenza - movimento.Quantita;
                //imp.Valore = imp.Giacenza * m_lotto.PrezzoUnitario;

                imp.GiacenzaInsufficienteFlag = (imp.Giacenza < 0 ? true : false);

                PolvereFacade pf = new PolvereFacade();
                Polvere polvere = pf.Get(imp.IDPolvere);

                //imp.SottoScortaFlag = (polvere.ScortaMinima < 0 ? true : false);

                if (polvere.ScortaMinima > lf.GetGiacenza(polvere.ID) - movimento.Quantita)
                {
                    imp.SottoScortaFlag = true;
                }

                imp.Note = movimento.Note;
                imp.IDImpianto = movimento.IDImpianto;
                //imp.Operatore = this.Principal.Operatore.ID;

                imp.IDCausaleScarico = movimento.IDCausaleScarico;

                MovimentiFacade impf = new MovimentiFacade();
                impf.AddMovimento(imp);

                // gestione dello stato di movimentazione del lotto...
                lf.UpdateStatoMovimentazione(imp.IDLotto, true);

                //Aggiorno la giacenza lotto
                lf.AggLotto(imp.IDLotto, movimento.Quantita);

                transaction.Complete();

                //MessageBox.Show("Inserimento Effettuato con successo !", "Gestione Polveri", MessageBoxButtons.OK, MessageBoxIcon.Information);

                retValue = true;
            }

            return retValue;
        }
    }
}
